파이썬다운 스타일은 컴파일러가 엄격히 통제하거나 사용하라고 강요하는 스타일이 아니다. 언어를 사용하고 서로 협업하는 과정중에 자연스럽게 생겨난 것이다. 파이썬의 선(The Zen of Python)을 보면 파이썬의 기본 철학을 확인할 수 있다.
Better way1. 사용 중인 파이썬 버전을 확인하자
python --version python3 --version
- 파이썬 2는 사용하지 말자. 2020년부터 더 이상 지원되지 않는다.
Better way2. PEP 8 스타일 가이드를 따르자
일관된 스타일은 많은 이점을 준다. 더 친숙한 검색과 가독성을 향상시킨다.
공백
- 탭 대신 스페이스를 사용해 들여쓰기를 하자
- 문법적으로 중요한 들여쓰기에는 4칸 스페이스를 사용하자
- 라인 길이는 79개 문자 이하여야 한다.
- 긴 식을 다음줄에 이어서 쓸 경우에는 일반적인 들여쓰기보다 4칸 스페이스를 더 들여써야 한다.
- 파일 안에서 각 함수와 클래스 사이에는 빈 줄을 두 줄 넣어라.
- 클래스 안에서 메서드와 메서드 사이에는 빈 줄을 한 줄 넣어라.
- 딕셔너리에서 키와 콜론 사이에는 공백을 넣지 않고, 한 줄에 키와 값을 같이 넣는 경우에는 콜론 다음에 스페이스를 하나 넣는다.
- 변수 대입에서 = 전후에는 스페이스를 하나씩만 넣는다.
- 타입 표기를 덧붙이는 경우에는 변수 이름과 콜론 사이에 공백을 넣지 않도록 주의하고, 콜론과 타입 정보 사이에는 스페이스를 하나 넣어라.
명명규약
- 함수, 변수, 애트리뷰트는 lowercase_underscore 처럼 소문자와 밑줄을 사용한다(snake case)
- 보호되어야 하는 인스턴스 애트리뷰트는 _leading_underscore 처럼 밑줄로 시작한다.
- 비공개 인스턴스 애트리뷰트는 __leading_underscore 처럼 두 개의 밑줄로 시작한다.
- 클래스는 CapotalizedWord 처럼 여러 단어를 이어 붙일때 각 단어의 첫글자를 대문자로 만든다(PascalCase)
- 모듈 수준의 상수는 ALL_CAPS 처럼 모든 글자를 대문자로 하고 단어와 단어 사이는 밑줄로 연결한다.
- 클래스에 들어있는 인스턴스 메서드는 호출 대상 객체가 가리키는 첫번째 인자의 이름으로 반드시 self 를 사용해야 한다.
- 클래스 메서드는 클래스를 가리키는 첫 번째 인자의 이름으로 반드시 cls 를 사용해야 한다.
식과 문
‘문제를 해결할 명백한 방법이 하나 있으며, 가급적이면 유일해야 한다’ - The Zen of Python
- 긍정적인 식을 부정하기 말고(if not a is b) 부정을 내부에 넣어라(if a is not b)
- 빈 컨테이너나 시퀀스([], ‘’) 등을 검사할 때는 길이를 0과 비교(if len(a) == 0)하지 말자. 빈 컨테이너나 시퀀스 값이 암묵적으로 False로 취급 된다는 사실을 활용해(if not container)라는 조건문을 사용하자.
- 한 줄짜리 if, while, for, except 문을 사용하지 말자. 명확성을 위해 각 부분을 여러줄에 나눠 배치하자.
- 식을 한 줄 안에 다 쓸 수 없는 경우는 식을 괄호로 둘러싸고 줄바꿈과 들여쓰기를 추가해서 읽기 쉽게 만들자.
- 여러 줄에 걸쳐 식을 쓸때는 줄이 계속된다는 표시를 하는 \ 문자보다는 괄호를 사용하자.
임포트
- import 문을 항상 파일 맨 앞에 위치시켜라.
- 모듈을 임포트할 때는 절대적인 이름을 사용하자.
- 반드시 상대적인 경로로 임포트 해야하는 경우에는 from . import foo 처럼 명시적인 구문을 사용하자.
- 임포트를 적을 때는 표준 라이브러리 모듈, 서브 파티 모듈, 직접 만든 모듈 순서로 섹션을 나누자. 각 섹션에는 알파벳 순서대로 정렬하자.
Better way3. byte와 str의 차이를 알아두라
파이썬에는 문자열 데이터의 시퀀스를 표현하는 두가지 타입이 있다. byte와 str이다.
byte 타입의 인스턴스에는 부호가 없는 8바이트 데이터가 그대로 들어간다.
a = b'h\x65llo' print(list(a)) print(a) >>> [104, 101, 108, 108, 111] b.'hello'
str 타입의 인스턴스에는 사람이 사용하는 언어의 문자를 표현하는 유니코드 코드 포인트가 들어있다.
a = 'a\u0300 propos' print(list(a)) print(a) >>> ['a', ''', ' ', 'p', 'r', 'o', 'p'. 'o', 's'] a'propos
str 인스턴스에는 이진 인코딩이 없고 byte에는 직접 대응하는 텍스트 인코딩이 없다.
댓글